#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int N=1e4+10;

int n,m;
int timestamp;
int dfn[N],low[N];
bool in_st[N];
int dout[N];
int id[N],scc_cnt,_size[N];
vector<int> edge[N];
stack<int> st;
void tarjan(int u)
{
	dfn[u]=low[u]=++timestamp;
	st.push(u);
	in_st[u]=true;
	for(int& e:edge[u])
	{
		if(!dfn[e])
		{
			tarjan(e);
			low[u]=min(low[u],low[e]);
		}
		else if(in_st[e]){
			low[u]=min(low[u],dfn[e]);
		}
	}
	
	if(dfn[u]==low[u])
	{
		++scc_cnt;
		int t;
		do{
			t=st.top();
			st.pop();
			in_st[t]=false;
			id[t]=scc_cnt;
			_size[scc_cnt]++;
		}while(t!=u);
	}
}
int main()
{
	cin>>n>>m;
	
	for(int i=0;i<m;i++)
	{
		int a,b;
		cin>>a>>b;
		edge[a].push_back(b);
	}
	
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int& j:edge[i])
		{
			int a=id[i],b=id[j];
			if(a!=b)
			{
				dout[a]++;
			}
		}
	}
	int sum=0,zero=0;
	for(int i=1;i<=scc_cnt;i++)
	{
		if(dout[i]==0)
		{
			zero++;
			sum+=_size[i];
			if(zero>1)
			{
				sum=0;
			}
		}
	}
	cout<<sum<<endl;
	
	return 0;
}
